﻿

namespace SistemaLogistica.DataAccess
{
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Xml.Linq;
    using SistemaLogistica.Business.Entities;
    using System.Data.Common;

    public class EmpresaData : BaseDataAccess
    {
        private EmpresaData() { }

        private readonly static EmpresaData instancia = new EmpresaData();

        public static EmpresaData Instancia
        {
            get { return instancia; }
        }

        public DateTime Fecha()
        {
            DateTime fecha = new DateTime();
            DbCommand command = db.GetStoredProcCommand("GetDateTime");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                if (dr.Read())
                {
                    fecha = dr.GetDateTime(dr.GetOrdinal("FechaServidor"));
                }
            }
            return fecha;
        }

        public void Cargar(string path)
        {
            try
            {
                XDocument documento;

                if (!File.Exists(path))
                {
                    documento = new XDocument(
                        new XDeclaration("1.0", "utf-8", "yes"),
                        new XElement("EmpresaInfo",
                            new XElement("Datos",
                                new XElement("RazonSocial", string.Empty),
                                new XElement("RUC", string.Empty),
                                new XElement("Gerente", string.Empty),
                                new XElement("Rubro", string.Empty),
                                new XElement("Ubicacion", string.Empty),
                                new XElement("Direccion", string.Empty),
                                new XElement("Telefono", string.Empty),
                                new XElement("Email", string.Empty),
                                new XElement("IGV", 0)),
                            new XElement("Notificacion",
                                new XElement("DiasLetra", 5),
                                new XElement("TiempoLetra", 10),
                                new XElement("TiempoArticulo", 30)
                                )));
                    documento.Save(path);
                }

                documento = XDocument.Load(path);
                var empresa = from e in documento.Descendants("Datos")
                              select new
                              {
                                  RazonSocial = e.Element("RazonSocial").Value ?? string.Empty,
                                  RUC = e.Element("RUC").Value ?? string.Empty,
                                  Gerente = e.Element("Gerente").Value ?? string.Empty,
                                  Rubro = e.Element("Rubro").Value ?? string.Empty,
                                  Ubicacion = e.Element("Ubicacion").Value ?? string.Empty,
                                  Direccion = e.Element("Direccion").Value ?? string.Empty,
                                  Telefono = e.Element("Telefono").Value ?? string.Empty,
                                  Email = e.Element("Email").Value ?? string.Empty,
                                  IGV = Convert.ToDecimal(e.Element("IGV").Value)
                              };
                foreach (var e in empresa)
                {
                    Empresa.RazonSocial = e.RazonSocial;
                    Empresa.RUC = e.RUC;
                    Empresa.Gerente = e.Gerente;
                    Empresa.Rubro = e.Rubro;
                    Empresa.Ubicacion = e.Ubicacion;
                    Empresa.Direccion = e.Direccion;
                    Empresa.Telefono = e.Telefono;
                    Empresa.Email = e.Email;
                    Empresa.IGV = e.IGV;
                }

                var notificacion = from e in documento.Descendants("Notificacion")
                                   select new
                                   {
                                       DiasLetra = Convert.ToInt32(e.Element("DiasLetra").Value),
                                       TiempoLetra = Convert.ToInt32(e.Element("TiempoLetra").Value),
                                       TiempoArticulo = Convert.ToInt32(e.Element("TiempoArticulo").Value)
                                   };
                foreach (var n in notificacion)
                {
                    Empresa.DiasLetra = n.DiasLetra;
                    Empresa.TiempoLetra = n.TiempoLetra;
                    Empresa.TiempoArticulo = n.TiempoArticulo;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Actualizar(string path)
        {
            try
            {
                if (!File.Exists(path))
                {
                    Cargar(path);
                    return;
                }

                XDocument documento = XDocument.Load(path);
                var elemento = from p in documento.Descendants("Datos")
                               select p;
                elemento.ElementAt(0).ReplaceAll(
                    new XElement("RazonSocial", Empresa.RazonSocial),
                    new XElement("RUC", Empresa.RUC),
                    new XElement("Gerente", Empresa.Gerente),
                    new XElement("Rubro", Empresa.Rubro),
                    new XElement("Ubicacion", Empresa.Ubicacion),
                    new XElement("Direccion", Empresa.Direccion),
                    new XElement("Telefono", Empresa.Telefono),
                    new XElement("Email", Empresa.Email),
                    new XElement("IGV", Empresa.IGV));

                var notificacion = from p in documento.Descendants("Notificacion")
                                   select p;

                notificacion.ElementAt(0).ReplaceAll(
                    new XElement("DiasLetra", Empresa.DiasLetra),
                    new XElement("TiempoLetra", Empresa.TiempoLetra),
                    new XElement("TiempoArticulo", Empresa.TiempoArticulo));
                documento.Save(path);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string GenerarCopiaDeSeguridad(string database, string path)
        {
            string mensaje = string.Empty;

            using (SqlConnection conexion = new SqlConnection(this.ConnectionString))
            {
                try
                {
                    conexion.Open();
                    SqlCommand comando = new SqlCommand();
                    comando.Connection = conexion;
                    comando.CommandType = CommandType.Text;
                    comando.CommandText = "BACKUP DATABASE [" + database + "] TO DISK = N'" + path + "' WITH  INIT, ";
                    comando.CommandText += "NOUNLOAD, NAME = N'Backup', NOSKIP, NOFORMAT ";
                    comando.CommandText += "RESTORE VERIFYONLY FROM DISK = '" + path + "'";
                    comando.ExecuteNonQuery();
                    mensaje = "Se ha creado un BackUp de La base de datos satisfactoriamente.";
                    conexion.Close();
                }
                catch (Exception ex)
                {
                    mensaje = "Error al copiar la base de datos\n" + ex.Message;
                }
            }
            return mensaje;
        }

        public string RestaurarCopiaDeSeguridad(string database, string path)
        {
            string mensaje = string.Empty;

            using (SqlConnection conexion = new SqlConnection(this.ConnectionString))
            {
                try
                {
                    conexion.Open();
                    SqlCommand comando = new SqlCommand();
                    comando.Connection = conexion;
                    comando.CommandType = CommandType.Text;
                    comando.CommandText = "RESTORE FILELISTONLY FROM DISK = '" + path + "' ";
                    comando.CommandText += "RESTORE DATABASE " + database + " FROM DISK = '" + path + "' WITH REPLACE";
                    comando.ExecuteNonQuery();
                    mensaje = "Se ha restaurado un BackUp de la base de datos satisfactoriamente.";
                    conexion.Close();
                }
                catch (Exception ex)
                {
                    mensaje = "Error al copiar la base de datos\n" + ex.Message;
                }
            }
            return mensaje;
        }
    }
}
